package study.kit.uitls;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 财年:
 * 2026财年  2025-06  2026-05
 * 2025财年  2024-06  2025-05
 * 2024财年  2023-06  2024-05
 * ----------
 * 季度:
 * Q1: 6, 7, 8
 * Q2: 9, 10, 11
 * Q3: 12, 1, 2
 * Q4: 3, 4, 5
 */
@Slf4j
public class FYearUtils {

    /**
     * 计算财年开始时间（yyyy-MM-dd 00:00:00.0）
     *
     * @param fiscalYear
     * @param quarterCode
     * @param month
     * @return Date
     */
    public static Date getFYStartDtime(Integer fiscalYear, Integer quarterCode, Integer month) {
        //
        if (Objects.isNull(fiscalYear)) {
            log.warn("fiscalYear is _null");
            return null;
        }
        Integer lastYear = fiscalYear - 1;

        // 只选财年，那么起始月当前财年去年的 6 月
        DateTime start = new DateTime();
        if (Objects.isNull(quarterCode)) {
            start.setField(DateField.YEAR, lastYear)
                    .setField(DateField.MONTH, 5); // 6月
            return DateUtil.beginOfMonth(start);
        }
        //
        switch (quarterCode) {
            case 1:
                start.setField(DateField.YEAR, lastYear)
                        .setField(DateField.MONTH, 5); // 6月
                break;
            case 2:
                start.setField(DateField.YEAR, lastYear)
                        .setField(DateField.MONTH, 8); // 9月
                break;
            case 3:
                start.setField(DateField.YEAR, lastYear)
                        .setField(DateField.MONTH, 11); // 12月
                break;
            case 4:
                start.setField(DateField.YEAR, fiscalYear)
                        .setField(DateField.MONTH, 2); // 3月
        }

        //
        if (Objects.nonNull(month)) {
            start.setField(DateField.MONTH, month - 1);
            if (month == 1 || month == 2) {
                start.setField(DateField.YEAR, fiscalYear);
            }
        }
        return DateUtil.beginOfMonth(start);
    }

    /**
     * 计算财年结束时间（yyyy-MM-dd 23:59:59.999）
     *
     * @param fiscalYear
     * @param quarterCode
     * @param month
     * @return Date
     */
    public static Date getFYEndDtime(Integer fiscalYear, Integer quarterCode, Integer month) {
        //
        if (Objects.isNull(fiscalYear)) {
            log.warn("fiscalYear is _null");
            return null;
        }
        Integer lastYear = fiscalYear - 1;

        // 只选财年，那么结束月为当前财年的 5 月
        DateTime end = new DateTime();
        if (Objects.isNull(quarterCode)) {
            end.setField(DateField.YEAR, fiscalYear).setField(DateField.MONTH, 4); // 5月
            return DateUtil.endOfMonth(end);
        }
        //
        switch (quarterCode) {
            case 1:
                end.setField(DateField.YEAR, lastYear)
                        .setField(DateField.MONTH, 7); // 8月
                break;
            case 2:
                end.setField(DateField.YEAR, lastYear)
                        .setField(DateField.MONTH, 10); // 11月
                break;
            case 3:
                end.setField(DateField.YEAR, fiscalYear)
                        .setField(DateField.MONTH, 1); // 2月
                break;
            case 4:
                end.setField(DateField.YEAR, fiscalYear)
                        .setField(DateField.MONTH, 4); // 5月
        }

        //
        if (Objects.nonNull(month)) {
            end.setField(DateField.MONTH, month - 1);
            //
            if (month == 12) {
                end.setField(DateField.YEAR, lastYear);
            }
        }
        return DateUtil.endOfMonth(end);
    }

    /**
     * 获取当前财年
     */
    public static Integer getCurrentFYear() {
        int month = DateUtil.thisMonth();
        if (month < 6) {
            return DateUtil.thisYear();
        }
        return DateUtil.thisYear() + 1;
    }

    /**
     * 获取当前财年
     */
    public static List<String> getFYearLt() {
        int thisFYear = getCurrentFYear();
        List<Integer> yearLt = Arrays.asList(thisFYear - 1, thisFYear, thisFYear + 1);
        return CollectionUtil.map(yearLt, e -> StrUtil.format("{}财年", e), true);
    }
}
